Introduce delayed prefixes
authorjustbur <justin@burkett.cc>
Fri, 10 Jun 2016 02:37:11 +0000 (22:37 -0400)
committerjustbur <justin@burkett.cc>
Fri, 10 Jun 2016 02:37:11 +0000 (22:37 -0400)
One version of idea in #128. This design is subject to change.

which-key.el

index abc9e36e6799deb2e2ac9a2a1ef4e05809c3c407..0175d3367e1b0908d1c675d724aa3e48f559d64a 100644 (file)
@@ -341,6 +341,20 @@ See http://www.gnu.org/software/emacs/manual/html_node/emacs/Modifier-Keys.html"
   :group 'which-key
   :type 'boolean)
 
+(defcustom which-key-delayed-prefixes nil
+  "A list of key sequences (in the form of vectors of events)
+that should not pop up the which-key buffer after
+`which-key-idle-delay' but after `which-key-idle-delay' +
+`which-key-delayed-prefixes-delay'."
+  :group 'which-key
+  :type '(repeat (vector integer)))
+
+(defcustom which-key-delayed-prefixes-delay 1
+  "When `which-key-delayed-prefixes' is non-nil delay which-key
+popup by this many seconds after `which-key-idle-delay'."
+  :group 'which-key
+  :type 'integer)
+
 ;; Hooks
 (defvar which-key-init-buffer-hook '()
   "Hook run when which-key buffer is initialized.")
@@ -470,6 +484,7 @@ used.")
 (defvar which-key--inhibit-next-operator-popup nil)
 (defvar which-key--current-show-keymap-name nil)
 (defvar which-key--prior-show-keymap-args nil)
+(defvar which-key--delayed-timer nil)
 
 (defvar which-key-key-based-description-replacement-alist '()
   "New version of
@@ -884,6 +899,7 @@ total height."
           which-key--current-show-keymap-name nil
           which-key--prior-show-keymap-args nil
           which-key--on-last-page nil)
+    (cancel-timer which-key--delayed-timer)
     (when (and which-key-idle-secondary-delay
                which-key--secondary-timer-active)
       (which-key--start-timer))
@@ -2057,9 +2073,10 @@ Finally, show the buffer."
                    (which-key--create-pages formatted-keys))
              (which-key--show-page 0)))))
 
-(defun which-key--update ()
+(defun which-key--update (&optional delayed)
   "Function run by timer to possibly trigger `which-key--create-buffer-and-show'."
-  (let ((prefix-keys (this-single-command-keys)))
+  (let ((prefix-keys (this-single-command-keys))
+        skip)
     ;; (when (> (length prefix-keys) 0)
     ;;  (message "key: %s" (key-description prefix-keys)))
     ;; (when (> (length prefix-keys) 0)
@@ -2086,6 +2103,15 @@ Finally, show the buffer."
                (eq this-command 'god-mode-self-insert))
       (setq prefix-keys (when which-key--god-mode-key-string
                           (kbd which-key--god-mode-key-string))))
+    (when (and which-key-delayed-prefixes
+               which-key-delayed-prefixes-delay
+               (> (length prefix-keys) 0)
+               (not delayed)
+               (member prefix-keys which-key-delayed-prefixes))
+      (setq which-key--delayed-timer
+            (run-with-idle-timer which-key-delayed-prefixes-delay nil
+                                 #'which-key--update t))
+      (setq skip t))
     (cond ((and (> (length prefix-keys) 0)
                 (or (keymapp (key-binding prefix-keys))
                     ;; Some keymaps are stored here like iso-transl-ctl-x-8-map
@@ -2095,6 +2121,7 @@ Finally, show the buffer."
                     (keymapp (which-key--safe-lookup-key
                               function-key-map prefix-keys)))
                 (not which-key-inhibit)
+                (not skip)
                 ;; Do not display the popup if a command is currently being
                 ;; executed
                 (or (and which-key-allow-evil-operators